package be.kdg.bombermanunlimited.client.gui.chat;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetSocketAddress;

import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import be.kdg.bombermanunlimited.client.CentralRegistry;
import be.kdg.bombermanunlimited.client.CentralRegistry.BombermanObjects;
import be.kdg.bombermanunlimited.client.network.INetwork;
import be.kdg.bombermanunlimited.client.network.NetworkFactory;
import be.kdg.bombermanunlimited.client.network.listeners.INetworkDataListener;
import be.kdg.bombermanunlimited.client.network.listeners.INetworkListener;
import be.kdg.bombermanunlimited.client.network.packet.ChatPacket;
import be.kdg.bombermanunlimited.client.network.packet.Packet;

/**
 * Een paneel dat de chat componenten bevat
 * @author Philip
 *
 */
public class ChatPanel extends JPanel implements INetworkDataListener {
	private static final long serialVersionUID = 1547913964208767724L;

	/* We hebben nodig */
	// een text area waar de chat in komt
	private JTextArea chat;
	// een input veld
	private JTextField input;
	// een netwerk waarover we onze packeten sturen
	private INetwork network;
	
	/**
	 * Maak een nieuw chat paneel aan
	 */
	public ChatPanel() {
		chat = new JTextArea();
		input = new JTextField();

		// open het netwerk
		network = NetworkFactory.getNetworkFactory().getRingNetwork();
		NetworkFactory.getNetworkFactory().getRingNetwork()
				.addNetworkListener(new NetworkListener());
		network.addDataListener(this, ChatPacket.class);

		setLayout(new BorderLayout());
		add(chat, BorderLayout.CENTER);
		add(input, BorderLayout.SOUTH);

		chat.setPreferredSize(new Dimension(100, 480));
		input.setPreferredSize(new Dimension(100, 30));

		chat.setEditable(false);
		input.setEnabled(NetworkFactory.getNetworkFactory().getRingNetwork()
				.hasConnections());

		input.requestFocus();

		// als er op enter wordt gedrukt bij het typen van een chat bericht
		input.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				CentralRegistry reg = CentralRegistry.getRegistry();

				// username: zegt iets
				ChatPacket packet = new ChatPacket(reg
						.getString(BombermanObjects.USERNAME)
						+ ": "
						+ input.getText());
				// stuur packet over het netwerk
				NetworkFactory.getNetworkFactory().getRingNetwork()
						.sendData(packet);
				// wis de input tekst
				input.setText("");
			}
		});
	}

	/**
	 * Een functie om systeem berichten in de chat te weergeven
	 * Deze zijn niet afkomstig van de spelers, maar van het spel zelf
	 * @param msg
	 */
	public void addSystemMessage(String msg) {
		chat.setText(chat.getText() + msg + "\n");
	}

	/**
	 * input aan/af zetten
	 * @param enabled
	 */
	public void setInputEnabled(boolean enabled) {
		input.setEnabled(enabled);
		// // System.out.println(input.isEnabled());
	}

	/**
	 * Als er data ontvangen wordt, toevoegen aan de chat
	 * als het een chat packet is.
	 */
	@Override
	public void onIncomingData(InetSocketAddress src, Packet packet) {
		if (packet instanceof ChatPacket) {
			ChatPacket cp = (ChatPacket) packet;

			chat.setText(chat.getText() + cp.getMessage() + "\n");
		}
	}

	private class NetworkListener implements INetworkListener {
		@Override
		public void onConnect() {
			// maak de input beschikbaar om te gebruiken, het heeft nu nut om te chatten.
			setInputEnabled(true);
		}
		
		@Override
		public void onDisconnect() {
			// System.out.println("[ChatPanel:NetworkListener] Disconnected");
			if (!NetworkFactory.getNetworkFactory().getRingNetwork()
					.hasConnections()) {
				// er zijn geen connecties meer, zet input af, chatten heeft toch geen zin
				setInputEnabled(false);
			}
		}

		@Override
		public void onConnectionLost() {
			// System.out.println("[ChatPanel:NetworkListener] Connection lost");
			// als er geen connecties meer zijn, zet chat af
			setInputEnabled(NetworkFactory.getNetworkFactory().getRingNetwork()
					.hasConnections());
		}

		@Override
		public void nodeAdded() {
		}

	}
}
